﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using SharpLite.Domain.DataInterfaces;
using DAEProde.Domain;
using DAEProde.Tasks;
using System.Web.Security;

namespace DAEProde.Web.Controllers
{
    [Authorize]
    public class TicketController : Controller
    {
        private IRepository<Ticket> _ticketRepository;
        private IRepository<Tournament> _tournamentRepository;
        private IRepository<MatchDate> _matchDateRepository;
        private IRepository<Prediction> _predictionRepository;
        private PredictionCudTasks _predictionMgmtTasks;
        private TicketCudTasks _ticketMgmtTasks;

        public TicketController(IRepository<Ticket> ticketRepository, IRepository<Tournament> tournamentRepository, IRepository<MatchDate> matchDateRepository,
                                IRepository<Prediction> predictionRepository, PredictionCudTasks predictionMgmtTasks, TicketCudTasks ticketMgmtTasks)
        {
            _ticketRepository = ticketRepository;
            _tournamentRepository = tournamentRepository;
            _matchDateRepository = matchDateRepository;
            _predictionRepository = predictionRepository;
            _predictionMgmtTasks = predictionMgmtTasks;
            _ticketMgmtTasks = ticketMgmtTasks;
        }

        //
        // GET: /Ticket/

        public ActionResult Index()
        {
            return View(_tournamentRepository.GetAll().OrderBy(c => c.Name));
        }

        public ActionResult ViewTicketOnce(int id, int fId)
        {
            var matchDate = new MatchDate();

            if (fId == 0)
            {
                var now = DateTime.Now;

                // Se obtiene la fecha actual. Se compara cada fecha con la fecha actual y se toma la primera que esta mas serca de la fecha actual.
                // Se tiene en cuenta 3 dias antes y 4 dias despues de cada fecha.
                matchDate = _tournamentRepository.Get(id).MatchDates.First(m => m.Date.Subtract(now).Days <= 3 && m.Date.Subtract(now).Days >= -4);
            }
            else
            {
                matchDate = _matchDateRepository.Get(fId);
            }

            // obtengo el usuario actual
            MembershipUser currentUser = Membership.GetUser(User.Identity.Name, true /* userIsOnline */);
            var usrName = currentUser.UserName;

            // se crea una boleta vacia
            var ticket = new Ticket();

            try
            {
                //obtengo la boleta asociada al usuario actual
                ticket = matchDate.Tickets.Single(u => u.UserName.Equals(usrName));
            }
            catch (Exception)
            {
                // si la fecha aun no tiene ninguna boleta asociada, entonces el usuario tampoco tiene una boleta para esta fecha
                // el usuario todavia no tiene asocadiada una boleta con la fecha actual
                ticket = new Ticket(usrName, matchDate);
                ActionConfirmation<Ticket> confirmation = _ticketMgmtTasks.SaveOrUpdate(ticket);

                if (!confirmation.WasSuccessful)
                {
                    TempData["message"] = confirmation.Message;
                    return RedirectToAction("Index");
                }
            }

            return View("ViewTicket", _ticketRepository.Get(ticket.Id));
        }

        public ActionResult ViewTicket(int id)
        {
            return View(_ticketRepository.Get(id));
        }

        public ActionResult ViewTicketResult(int id)
        {
            return View(_ticketRepository.Get(id));
        }

        public ActionResult Actualizar(string r, int tId, int pId)
        {
            var predition = _predictionRepository.Get(pId);
            predition.Will = r;

            _predictionMgmtTasks.SaveOrUpdate(predition);

            return View("ViewTicket", _ticketRepository.Get(tId));
        }

        public ActionResult ChangeMatchDate(int id, int fId)
        {
            return RedirectToAction("ViewTicketOnce", new { id = id, fId = fId });
        }
    }
}
